STM32 GPIO 详解:从基础到实战的通用输入输出口指南

GPIO(General Purpose Input Output),即通用输入输出口,是 STM32 单片机中最基础也最常用的外设之一。它就像单片机与外部世界的 “桥梁”,让我们能读取按键、传感器的信号,也能控制 LED、电机、显示屏等设备的动作。本文将从 GPIO 的工作原理、配置方法、典型应用三个维度,带你全面掌握 STM32 GPIO 的使用。

一、GPIO 的工作原理与硬件结构

STM32 的 GPIO 引脚并非简单的 “导线”,而是由多路复用器、模式控制电路、上下拉电阻、输出驱动电路等模块组成的复杂系统。以 STM32F103 系列为例,每个 GPIO 引脚都支持以下核心功能:

1.模式分类

GPIO_Mode描述
GPIO_Mode_AIN模拟输入用于 ADC 采样,引脚信号直接接入模拟电路。
GPIO_Mode_IN_FLOATING浮空输入引脚电平完全由外部电路决定,无内部上下拉;
GPIO_Mode_IPD下拉输入内部下拉电阻将引脚默认拉至低电平,外部高电平信号可被正确读取;
GPIO_Mode_IPU上拉输入内部上拉电阻将引脚默认拉至高电平,外部低电平信号可被正确读取;
GPIO_Mode_Out_OD开漏输出仅能主动拉低电平,高电平需外部上拉电阻实现,常用于 I2C 等总线通信;
GPIO_Mode_Out_PP推挽输出可主动输出高电平(VCC)或低电平(GND),驱动能力强;
GPIO_Mode_AF_OD复用开漏输出引脚功能被复用为串口、定时器等外设的输出(如 USART 的 TX 引脚)。
GPIO_Mode_AF_PP复用推挽输出引脚功能被复用为串口、定时器等外设的输出(如 USART 的 TX 引脚)。

2.IO输出速度

GPIO_Speed描述
GPIO_Speed_2MHz低速
GPIO_Speed_10MHz中速
GPIO_Speed_50MHz高速

二、GPIO 的配置流程(以标准库为例)

在 STM32 开发中,配置 GPIO 通常遵循 “时钟使能→模式配置→上下拉 / 速度设置→功能使能” 的流程。以下是一个完整的配置示例:

分别对两个IO口进行初始化,GPIOC_Pin_13为推挽输出,GPIOB_Pin_4为上拉输入。

#include "stm32f10x.h"

int main(void)
{
	//开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//初始化GPIO
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIO_InitStruct);
	//把GPIO_InitStruct 中的每一个参数按缺省值填入
	GPIO_StructInit(&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == Bit_RESET){
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
		}
		else{
            //设置或者清除指定的数据端口位 
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
		}
	}
}

首先需要开启相应GPIO的时钟;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

接着就是创建GPIO的结构体,配置好参数后,使用GPIO_Init();函数进行初始化;

GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;    //IO口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //模式为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; //GPIO输出频率
GPIO_Init(GPIOC, &GPIO_InitStruct);

初始化后就可以使用GPIO_WriteBit();单独控制某一个IO口。

三、GPIO 使用的注意事项

  1. 引脚复用冲突:STM32 的部分 GPIO 引脚具有多外设复用功能(如 PA9/PA10 同时是 USART1 的 TX/RX),使用时需避免功能冲突;
  2. 驱动能力与负载:GPIO 输出电流有限,驱动大功率负载(如电机)需外接驱动电路(如三极管、MOS 管);
  3. 抗干扰设计:对于外部输入信号(如传感器、按键),需通过 RC 滤波、施密特触发器等硬件或软件消抖提升稳定性;
  4. 低功耗考虑:闲置的 GPIO 建议配置为模拟输入或上拉 / 下拉输入,避免浮空状态引入的额外功耗。
本文为DUSK原创文章。
文章作者:DUSK
文章标题:STM32 GPIO 详解:从基础到实战的通用输入输出口指南
文章链接:https://blog.dusklane.top/archives/364
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自DUSK
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇